﻿using System.Data;
using Bit.Core.Repositories;
using Bit.Core.Settings;
using Dapper;
using Microsoft.Data.SqlClient;

namespace Bit.Infrastructure.Dapper.Repositories;

public class MaintenanceRepository : BaseRepository, IMaintenanceRepository
{
    public MaintenanceRepository(GlobalSettings globalSettings)
        : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString)
    { }

    public MaintenanceRepository(string connectionString, string readOnlyConnectionString)
        : base(connectionString, readOnlyConnectionString)
    { }

    public async Task UpdateStatisticsAsync()
    {
        using (var connection = new SqlConnection(ConnectionString))
        {
            await connection.ExecuteAsync(
                "[dbo].[AzureSQLMaintenance]",
                new { operation = "statistics", mode = "smart", LogToTable = true },
                commandType: CommandType.StoredProcedure,
                commandTimeout: 172800);
        }
    }

    public async Task DisableCipherAutoStatsAsync()
    {
        using (var connection = new SqlConnection(ConnectionString))
        {
            await connection.ExecuteAsync(
                "sp_autostats",
                new { tblname = "[dbo].[Cipher]", flagc = "OFF" },
                commandType: CommandType.StoredProcedure);
        }
    }

    public async Task RebuildIndexesAsync()
    {
        using (var connection = new SqlConnection(ConnectionString))
        {
            await connection.ExecuteAsync(
                "[dbo].[AzureSQLMaintenance]",
                new { operation = "index", mode = "smart", LogToTable = true },
                commandType: CommandType.StoredProcedure,
                commandTimeout: 172800);
        }
    }

    public async Task DeleteExpiredGrantsAsync()
    {
        using (var connection = new SqlConnection(ConnectionString))
        {
            await connection.ExecuteAsync(
                "[dbo].[Grant_DeleteExpired]",
                commandType: CommandType.StoredProcedure,
                commandTimeout: 172800);
        }
    }

    public async Task DeleteExpiredSponsorshipsAsync(DateTime validUntilBeforeDate)
    {
        using (var connection = new SqlConnection(ConnectionString))
        {
            await connection.ExecuteAsync(
                "[dbo].[OrganizationSponsorship_DeleteExpired]",
                new { ValidUntilBeforeDate = validUntilBeforeDate },
                commandType: CommandType.StoredProcedure,
                commandTimeout: 172800);
        }
    }
}
